package com.xuan.yupao.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.xuan.yupao.model.domain.Team;
import com.xuan.yupao.model.domain.User;
import com.xuan.yupao.model.domain.dto.TeamQuery;
import com.xuan.yupao.model.domain.request.TeamJoinRequest;
import com.xuan.yupao.model.domain.request.TeamKickMemberRequest;
import com.xuan.yupao.model.domain.request.TeamUpdateRequest;
import com.xuan.yupao.model.domain.vo.TeamVo;
import com.xuan.yupao.model.domain.vo.UserVo;

import java.util.List;

/**
* @author 清凉茶
* @description 针对表【team】的数据库操作Service
* @createDate 2024-05-10 18:36:13
*/
public interface TeamService extends IService<Team> {

    /**
     *  新增队伍
     * @param team 队伍信息
     * @param loginUser  当前登录用户
     * @return
     */
    boolean addTeam(Team team, User loginUser);

    /**
     *  更新队伍信息
     * @param teamUpdateRequest 队伍更新值
     * @param loginUser
     * @return
     */
    boolean updateTeam(TeamUpdateRequest teamUpdateRequest, User loginUser);

    /**
     * 查询全部队伍
     *
     * @param teamQuery 查询条件
     * @param isAdmin
     * @return
     */
    List<Team> listTeams(TeamQuery teamQuery, boolean isAdmin);

    /**
     * 分页查询队伍
     * @param teamQuery 查询条件
     * @param isAdmin 当前登录用户是否为管理员
     * @return
     */
    List<Team> listPage(TeamQuery teamQuery, boolean isAdmin);

    /**
     * 解散队伍(管理员或队长)
     * @param teamId 队伍id
     * @param loginUser 当前登录用户
     * @return
     */
    boolean deleteTeam(long teamId, User loginUser);

    /**
     * 用户加入队伍
     * @param teamJoinRequest   队伍id 和 密码(可能需要)
     * @param loginUser         登录用户
     * @return
     */
    Boolean joinTeam(TeamJoinRequest teamJoinRequest, User loginUser);

    /**
     * 用户退出队伍
     * @param teamId    队伍id
     * @param userId   登录用户id
     * @return
     */
    boolean quitTeam(Long teamId, Long userId);

    /**
     *  补充该队伍的队长信息,队伍人数,当前用户(已登录)是否已加入队伍
     * @param teamList  根据条件查询出来的队伍
     * @param loginUser 当前用户
     * @return  队伍信息(包括脱敏后的队长信息)
     */
    List<TeamVo> addExtraTeamInfo(List<Team> teamList, User loginUser);


    /**
     *  查询当前用户创建或者加入的队伍信息
     * @param teamQuery
     * @param isAdmin  管理员可以查看私有的房间
     * @return
     */
    List<Team> listTeamsCreateOrJoin(TeamQuery teamQuery, boolean isAdmin);

    /**
     * 根据队伍 id 获取队伍基本信息(包含队长名称)
     *
     * @param teamId 队伍 id
     * @return 队伍的基本信息
     */
    List<TeamVo> getTeamInfoById(Long teamId, User loginUser);

    /**
     * 根据队伍 id 获取队伍中所有成员的信息
     * @param teamId
     * @return
     */
    List<UserVo> getTeamMemberInfo(Long teamId, long loginUserId);

    /**
     *  踢出队伍成员
     * @param kickMemberRequest 队伍id 和 用户id
     * @param loginUser 登录用户
     * @return 操作结果
     */
    boolean kickMember(TeamKickMemberRequest kickMemberRequest, User loginUser);
}
